/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BD;

import Seniat.Utils;
import gui.VentanaArchivo;
import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import javax.swing.JOptionPane;
import javax.xml.bind.annotation.XmlRootElement;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.ss.usermodel.DateUtil;

/**
 *
 * @author ARMGARCES
 */
@Entity
@Table(name = "retenciones")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Retenciones.findAll", query = "SELECT r FROM Retenciones r"),
    @NamedQuery(name = "Retenciones.findByIdRetencionesEfectivas", query = "SELECT r FROM Retenciones r WHERE r.idRetencionesEfectivas = :idRetencionesEfectivas"),
    @NamedQuery(name = "Retenciones.findByRifAgente", query = "SELECT r FROM Retenciones r WHERE r.rifAgente = :rifAgente"),
    @NamedQuery(name = "Retenciones.findByAgente", query = "SELECT r FROM Retenciones r WHERE r.agente = :agente"),
    @NamedQuery(name = "Retenciones.findByFecha", query = "SELECT r FROM Retenciones r WHERE r.fecha = :fecha"),
    @NamedQuery(name = "Retenciones.findByMes", query = "SELECT r FROM Retenciones r WHERE r.mes = :mes"),
    @NamedQuery(name = "Retenciones.findByDocumento", query = "SELECT r FROM Retenciones r WHERE r.documento = :documento"),
    @NamedQuery(name = "Retenciones.findByMonto1", query = "SELECT r FROM Retenciones r WHERE r.monto1 = :monto1"),
    @NamedQuery(name = "Retenciones.findByMonto2", query = "SELECT r FROM Retenciones r WHERE r.monto2 = :monto2"),
    @NamedQuery(name = "Retenciones.findByRetenido1", query = "SELECT r FROM Retenciones r WHERE r.retenido1 = :retenido1"),
    @NamedQuery(name = "Retenciones.findByRetenido2", query = "SELECT r FROM Retenciones r WHERE r.retenido2 = :retenido2"),
    @NamedQuery(name = "Retenciones.findByExcento1", query = "SELECT r FROM Retenciones r WHERE r.excento1 = :excento1"),
    @NamedQuery(name = "Retenciones.findByExcento2", query = "SELECT r FROM Retenciones r WHERE r.excento2 = :excento2"),
    @NamedQuery(name = "Retenciones.findByNroDocumento", query = "SELECT r FROM Retenciones r WHERE r.nroDocumento = :nroDocumento"),
    @NamedQuery(name = "Retenciones.findByNroControl", query = "SELECT r FROM Retenciones r WHERE r.nroControl = :nroControl"),
    @NamedQuery(name = "Retenciones.findByNroAfectado", query = "SELECT r FROM Retenciones r WHERE r.nroAfectado = :nroAfectado"),
    @NamedQuery(name = "Retenciones.findByAlicuota", query = "SELECT r FROM Retenciones r WHERE r.alicuota = :alicuota"),
    @NamedQuery(name = "Retenciones.findRetenciones", query = "SELECT r FROM Retenciones r WHERE r.rifAgente = :rifAgente AND r.mes = :mes AND r.documento = :documento ORDER BY r.fecha DESC")})
public class Retenciones implements Serializable {
    public  static final String PERSISTENCE_UNIT_NAME = java.util.ResourceBundle.getBundle("Seniat/properties").getString("persistence");
    @Basic(optional = false)
    @Column(name = "fecha")
    @Temporal(TemporalType.DATE)
    private Date fecha;
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idRetenciones_Efectivas")
    private Long idRetencionesEfectivas;
    @Basic(optional = false)
    @Column(name = "rif_agente")
    private String rifAgente;
    @Basic(optional = false)
    @Column(name = "agente")
    private String agente;
    @Basic(optional = false)
    @Column(name = "mes")
    private String mes;
    @Basic(optional = false)
    @Column(name = "documento")
    private String documento;
    @Basic(optional = false)
    @Column(name = "monto1")
    private double monto1;
    @Basic(optional = false)
    @Column(name = "monto2")
    private double monto2;
    @Basic(optional = false)
    @Column(name = "retenido1")
    private double retenido1;
    @Basic(optional = false)
    @Column(name = "retenido2")
    private double retenido2;
    @Basic(optional = false)
    @Column(name = "excento1")
    private double excento1;
    @Basic(optional = false)
    @Column(name = "excento2")
    private double excento2;
    @Basic(optional = false)
    @Column(name = "nro_documento")
    private String nroDocumento;
    @Basic(optional = false)
    @Column(name = "nro_control")
    private String nroControl;
    @Basic(optional = false)
    @Column(name = "nro_afectado")
    private String nroAfectado;
    @Basic(optional = false)
    @Column(name = "alicuota")
    private int alicuota;

    public Retenciones() {
    }

    public Retenciones(Long idRetencionesEfectivas) {
        this.idRetencionesEfectivas = idRetencionesEfectivas;
    }

    public Retenciones(List list) {
        for (int j = 0; j < list.size(); j++) {
            HSSFCell cell = (HSSFCell) list.get(j);
            switch(j){
                case 0:
                    this.rifAgente = cell.getStringCellValue();
                    break;
                case 1:
                    this.agente = cell.getStringCellValue();
                    break;
                case 2:
                    if (DateUtil.isCellDateFormatted(cell)) {
                        Date date  = cell.getDateCellValue();
                        this.fecha = date;
                    }
                    break;
                case 3:
                    this.documento = cell.getStringCellValue();
                    break;
                case 4:
                    this.monto1 = cell.getNumericCellValue();
                    break;
                case 5:
                    this.monto2 = cell.getNumericCellValue();
                    break;
                case 6:
                    this.retenido1 = cell.getNumericCellValue();
                    break;
                case 7:
                    this.retenido2 = cell.getNumericCellValue();
                    break;
                case 8:
                    this.excento1 = cell.getNumericCellValue();
                    break;
                case 9:
                    this.excento2 = cell.getNumericCellValue();
                    break;
                case 10:
                    this.nroDocumento = cell.toString();
                    break;
                case 11:
                    this.nroControl =cell.toString();
                    break;
                case 12:
                    this.nroAfectado = cell.toString();
                    break;
                case 13:
                    this.alicuota = (int) cell.getNumericCellValue();
                    break;
            }
        }
    }
    
    public Long getIdRetencionesEfectivas() {
        return idRetencionesEfectivas;
    }

    public void setIdRetencionesEfectivas(Long idRetencionesEfectivas) {
        this.idRetencionesEfectivas = idRetencionesEfectivas;
    }

    public String getRifAgente() {
        return rifAgente;
    }

    public void setRifAgente(String rifAgente) {
        this.rifAgente = rifAgente;
    }

    public String getAgente() {
        return agente;
    }

    public void setAgente(String agente) {
        this.agente = agente;
    }
    
    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public String getMes() {
        return mes;
    }

    public void setMes(String mes) {
        this.mes = mes;
    }

    public String getDocumento() {
        return documento;
    }

    public void setDocumento(String documento) {
        this.documento = documento;
    }

    public double getMonto1() {
        return monto1;
    }

    public void setMonto1(double monto1) {
        this.monto1 = monto1;
    }

    public double getMonto2() {
        return monto2;
    }

    public void setMonto2(double monto2) {
        this.monto2 = monto2;
    }

    public double getRetenido1() {
        return retenido1;
    }

    public void setRetenido1(double retenido1) {
        this.retenido1 = retenido1;
    }

    public double getRetenido2() {
        return retenido2;
    }

    public void setRetenido2(double retenido2) {
        this.retenido2 = retenido2;
    }

    public double getExcento1() {
        return excento1;
    }

    public void setExcento1(double excento1) {
        this.excento1 = excento1;
    }

    public double getExcento2() {
        return excento2;
    }

    public void setExcento2(double excento2) {
        this.excento2 = excento2;
    }

    public String getNroDocumento() {
        return nroDocumento;
    }

    public void setNroDocumento(String nroDocumento) {
        this.nroDocumento = nroDocumento;
    }

    public String getNroControl() {
        return nroControl;
    }

    public void setNroControl(String nroControl) {
        this.nroControl = nroControl;
    }

    public String getNroAfectado() {
        return nroAfectado;
    }

    public void setNroAfectado(String nroAfectado) {
        this.nroAfectado = nroAfectado;
    }

    public int getAlicuota() {
        return alicuota;
    }

    public void setAlicuota(int alicuota) {
        this.alicuota = alicuota;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idRetencionesEfectivas != null ? idRetencionesEfectivas.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Retenciones)) {
            return false;
        }
        Retenciones other = (Retenciones) object;
        if ((this.idRetencionesEfectivas == null && other.idRetencionesEfectivas != null) || (this.idRetencionesEfectivas != null && !this.idRetencionesEfectivas.equals(other.idRetencionesEfectivas))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "BD.Retenciones[ idRetencionesEfectivas=" + idRetencionesEfectivas + " ]";
    }
    
    /**
     * 
     * @param ventana 
     * @param path 
     */
    public void insert(VentanaArchivo ventana,String path){
        try{
            EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
            EntityManager em = factory.createEntityManager();
            
            em.getTransaction().begin();
            this.mes    = Utils.getPeriodo(path);
            //this.agente = "";
            em.persist(this);
            
            em.getTransaction().commit();
            em.close();
                        
        }catch(Exception e){
            String mnsj  = "Error Inesperado, por Favor Intente Luego!";
            String title = "Error de Sistema";
            JOptionPane.showMessageDialog(ventana,mnsj,title, JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();            
        }
    }
    
    /**
     * 
     * @param file 
     */
    public static void borrarRegistrosDelMes(File file) {
      try{
          if(file != null){
            EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
            EntityManager em = factory.createEntityManager();
            
            List<Retenciones> result = new ArrayList<Retenciones>();

            //use entity manager to retrieve named query
            Query find = em.createNamedQuery("Retenciones.findByMes");
            find.setParameter("mes", Utils.getPeriodo(file.getName()));
            //execute query and get results
            result = find.getResultList();
            
            em.getTransaction().begin();
            for(Retenciones retencion : result){
                em.remove(retencion);
            }
            em.getTransaction().commit();
            em.close();
          }          
        }catch(Exception e){
            e.printStackTrace();            
        }
    }
    
}
